// 记忆函数
const _ = require('lodash');

function getArea (r) {
    console.log(r);
    return Math.PI * r * r;
}

// let getAreaWithMemory = _.memoize(getArea);
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));

//模拟memoize方法的实现
function memoize (f) {
    let cache = {};

    return function() {
        //JSON.stringify 将对象转化为JSON字符串
        let key = JSON.stringify(arguments);
        //先获取缓存是否有值 获取到则直接返回； 若无值则调用 使用apply的原因是需要将arguments数组内的每一项参数展开传给f
        cache[key] = cache[key] || f.apply(f, arguments);
        return cache[key];
    };
}

let getAreaWithMemory = memoize(getArea);
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));

// 打印结果
// 4
// 50.26548245743669
// 50.26548245743669
// 50.26548245743669